package com.jl15988.mybatispluskit.join.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jl15988.mybatispluskit.join.mapper.BaseJoinMapper;
import com.jl15988.mybatispluskit.join.service.BaseJoinService;
import com.jl15988.mybatispluskit.join.wrapper.JoinLambdaWrapper;

import java.util.List;
import java.util.Map;

/**
 * 基础关联查询服务实现类
 * 扩展 MyBatis-Plus 的 ServiceImpl，提供关联查询功能的具体实现
 * 
 * @param <M> Mapper 类型
 * @param <T> 实体类型
 * @author Jalon
 * @since 2025/1/1
 */
public class BaseJoinServiceImpl<M extends BaseJoinMapper<T>, T> 
        extends ServiceImpl<M, T> implements BaseJoinService<T> {
    
    /**
     * 根据 Lambda 关联查询包装器查询列表
     * 
     * @param joinLambdaWrapper Lambda 关联查询包装器
     * @return 查询结果列表
     */
    @Override
    public List<T> listJoin(JoinLambdaWrapper<T> joinLambdaWrapper) {
        return baseMapper.selectJoinLambdaList(joinLambdaWrapper);
    }
    
    /**
     * 根据 Lambda 关联查询包装器查询单条记录
     * 
     * @param joinLambdaWrapper Lambda 关联查询包装器
     * @return 查询结果
     */
    @Override
    public T getOneJoin(JoinLambdaWrapper<T> joinLambdaWrapper) {
        return baseMapper.selectJoinLambdaOne(joinLambdaWrapper);
    }
    
    /**
     * 根据 Lambda 关联查询包装器查询记录数
     * 
     * @param joinLambdaWrapper Lambda 关联查询包装器
     * @return 记录数
     */
    @Override
    public long countJoin(JoinLambdaWrapper<T> joinLambdaWrapper) {
        Long count = baseMapper.selectJoinLambdaCount(joinLambdaWrapper);
        return count != null ? count : 0L;
    }
    
    /**
     * 根据 Lambda 关联查询包装器查询 Map 列表
     * 用于查询多表字段组合结果
     * 
     * @param joinLambdaWrapper Lambda 关联查询包装器
     * @return Map 列表结果
     */
    @Override
    public List<Map<String, Object>> listJoinMaps(JoinLambdaWrapper<T> joinLambdaWrapper) {
        return baseMapper.selectJoinLambdaMaps(joinLambdaWrapper);
    }
    
    /**
     * 创建 Lambda 关联查询包装器
     * 
     * @return Lambda 关联查询包装器
     */
    @Override
    public JoinLambdaWrapper<T> joinLambdaWrapper() {
        return new JoinLambdaWrapper<>();
    }
} 